/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.ReconhecerTerminais;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraIncremento extends Regra {

    protected static Regra instancia;

    protected String estrutura = "identificador <op_incremento> | <op_incremento> identificador";
    RegraOpIncremento regraOpIncremento = RegraOpIncremento.getInstance();
    ReconhecerTerminais reconhecerTerminais = new ReconhecerTerminais();



    /**
     * Construtor privado necessario ao singleton
     */
    private RegraIncremento() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraIncremento getInstance() {
        if (instancia == null) {
            instancia = new RegraIncremento();
        }
        return (RegraIncremento) instancia;
    }


    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
      
        NoArvore regraIncremento = new NoArvore("<incremento>", false);
        if (listaTokens.getFirst().getToken().equals("identificador")) {
            regraIncremento.adicionaFilho(reconhecerIdentificador(listaTokens));
            regraIncremento.adicionaFilho(reconhecerOpIncremento(listaTokens));
        } else {
            regraIncremento.adicionaFilho(reconhecerOpIncremento(listaTokens));
            regraIncremento.adicionaFilho(reconhecerIdentificador(listaTokens));
        }

        return regraIncremento;
    }

    public NoArvore reconhecerIdentificador(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        LinkToken token = listaTokens.removeFirst();

        if (token.getToken().equals("identificador")) {
            return new NoArvore("identificador", true);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta identificador", estrutura, token.getLinha());
        throw erro;
    }

    public NoArvore reconhecerOpIncremento(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

        LinkToken token = listaTokens.getFirst();
        if (regraOpIncremento.getPrimeiro().contains(token.getToken())) {
            return regraOpIncremento.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta incremento", estrutura, token.getLinha());
        throw erro;

    }

    

    @Override
    protected void setPrimeiro() {
        this.primeiro.add("incremento");
        this.primeiro.add("++");
        this.primeiro.add("--");
    }

    @Override
    protected void setSeguinte() {
        //this.seguinte = getUniao(this.seguinte, RegraInstrucao.getInstance().getSeguinte());
        this.seguinte.add(";");

    }
}
